#include <iostream>

using namespace std;

/*
    初学者容易搞错隐藏的概念
    关键点：子类写了同名函数（不关心形参，不关心形参），则子类隐藏父类所有同名函数（不管是不是虚函数）

    类出现跟父类同名的方法(子类隐藏父类的同名方法)
               区分方法：
                 c1.eat()          //使用子类自己的eat
                 c1.Animal::eat()  //使用父类的eat
     子类隐藏了父类的同名方法
     经典笔试题：
          请问C++中隐藏，重载，重写(复写,覆盖)三个概念的区别？
            (1)隐藏的概念
                 第一: 必须是发生在父子类之间
                 第二：子类必须要重新定义跟父类相同名字的函数，参数可以相同，也可以不相同
               此时子类会隐藏父类的同名方法,隐藏的具体体现，子类对象无法直接调用父类的同名方法了，必须子类对象.父类名::同名方法()
            (2)重载的概念(要求相同作用域)
                 第一：必须发生在同一个类的里面
                 第二：函数名相同，参数的类型或者个数至少有一个不同

*/

class Animal
{
public:
    void eat()
    {
        cout << "animal eat" << endl;
    }
    void sleep()
    {
        cout << "animal sleep" << endl;
    }
    void run()
    {
        cout << "gogogo 出发咯~" << endl;
    }
};

class Cat : public Animal
{
public:
    void miao()
    {
        cout << "cat miao" << endl;
    }

    void eat()
    {
        cout << "cat eat" << endl;
    }

    void sleep()
    {
        cout << "cat sleep" << endl;
    }
};

int main()
{
    Cat cat;
    cat.eat();         // 调用子类的方法
    cat.sleep();       // 调用子类的方法
    cat.run();         // 调用父类的方法
    cat.miao();        // 调用子类的方法
    cat.Animal::eat(); // 调用父类的方法

    Animal *animal = &cat;
}